package com.luxsoft.siipap.em.replica.importadores.ventas;

import java.util.List;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.JdbcTemplate;

import com.luxsoft.siipap.cxc.model.OrigenDeOperacion;
import com.luxsoft.siipap.em.replica.model.Registro;
import com.luxsoft.siipap.em.replica.model.Registro.Tipo;
import com.luxsoft.siipap.em.replica.online.ImportadorOnLine;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.ventas.model.Venta;
import com.luxsoft.siipap.ventas.model.VentaDet;

/**
 * Importador en linea de  ventas a SiipapWin (MySQL) 
 * desde el sistema de replica de Siipap (archivos .POR)
 * 
 * @author Ruben Cancino
 *
 */
public class ImportadorDeVentasOnLine implements ImportadorOnLine{
	
	private JdbcTemplate target;
	
	private VentaRegistroMapper ventaMapper;
	
	private VentasDetRegistroMapper ventaDetMapper;
	
	private Logger logger=Logger.getLogger(getClass());
	
	String[] validos={"MOCOCA","MOCOMO","MOVCRE","ALMACE"};

	public Object importar(Registro r) {
		if(r.getArchivo().startsWith("MOCOCA") || 
				r.getArchivo().startsWith("MOCOMO") || 
				r.getArchivo().startsWith("MOVCRE") 
				||r.getArchivo().startsWith("ALMACE") 
			){
					
			String prefix=null;
			OrigenDeOperacion origen=null;
			if(r.getArchivo().startsWith("MOCOCA")){
				prefix="MCA";
				origen=OrigenDeOperacion.CAM;
			}
			else if(r.getArchivo().startsWith("MOCOMO")){
				prefix="MCM";
				origen=OrigenDeOperacion.MOS;
			}
			else if(r.getArchivo().startsWith("MOVCRE")){
				prefix="MCR";
				origen=OrigenDeOperacion.CRE;
			}else if(r.getArchivo().startsWith("ALMACE")){
				procesarPartida(r);
			}
			Number idenope=r.getNumber(prefix+"IDENOPE");
			if(idenope!=null){
				if(idenope.intValue()==1){
					if(r.getTipo().equals(Registro.Tipo.ALTA)){
						Venta v=getVentaMapper().mapRegistro(r);
						v.setOrigen(origen);
						v.setComentario2("Importada mediante archivo:"+r.getOrigen());
						persistirVenta(v);
						logger.info("Persistiendo venta: "+v);
					}
				}				
			}	
			
		}
		return null;
	}
	
	public void procesarPartida(Registro r){
		String tipo=r.getString("ALMTIPO");
		if(tipo.equals("FAC")){			
			if(Tipo.ALTA.equals(r.getTipo())){
				VentaDet det=getVentaDetMapper().mapRegistro(r);
				//Localizar la venta
				Venta v=buscarVenta(det);
				if(v!=null){
					v.agregarPartida(det);
					v=persistirVenta(v);
					if(logger.isDebugEnabled()){
						logger.debug("Partida importada para la venta:"+v);
					}
				}else{
					logger.info("Partida no localizo su venta: "+det);
				}
				
			}
			else if(Tipo.CAMBIO.equals(r.getTipo())){
				System.out.println("Partida: "+r);
			}
		}
	}
	
	private Venta buscarVenta(VentaDet det){
		String hql="from Venta v left join fetch v.partidas p " +
				" where v.sucursal.id=? " +
				"   and v.documento=? " +
				"   and v.serieSiipap=? ";
		Object[] values={det.getSucursal().getId(),det.getDocumento(),det.getSerie()};
		List<Venta> res=ServiceLocator2.getHibernateTemplate().find(hql, values);
		return res.isEmpty()?null:res.get(0);
	}
	
	private Venta persistirVenta(Venta v){
		try {
			DescuentosUtils.asignarDescuentos(v);
			v=ServiceLocator2.getVentasManager().salvar(v);
			//ServiceLocator2.getClienteServices().exportarSaldo(v.getCliente());
			return v;
		} catch (DataIntegrityViolationException e) {
			logger.info(ExceptionUtils.getRootCauseMessage(e));
			logger.error(e);
			return null;
		}
	}
	
	public VentaRegistroMapper getVentaMapper() {
		return ventaMapper;
	}

	public void setVentaMapper(VentaRegistroMapper ventaMapper) {
		this.ventaMapper = ventaMapper;
	}
	
	public VentasDetRegistroMapper getVentaDetMapper() {
		return ventaDetMapper;
	}

	public void setVentaDetMapper(VentasDetRegistroMapper ventaDetMapper) {
		this.ventaDetMapper = ventaDetMapper;
	}

	public JdbcTemplate getTarget() {
		return target;
	}
	public void setTarget(JdbcTemplate target) {
		this.target = target;
	}
	
	/**
	 * diapago=5 (N)
 facturi=GFG    (C)
 nodocto=57899 (N)
 Mcrhrsreal=14:50:43 (C)
 diarevi=1 (N)
 fecha  =22/08/2008 (D)
 calle  =AV.CUITLAHUAC NO.2309                    (C)
 idenope=1 (N)
 colonia=SAN SALVADOR XOCHIMANCA                  (C)
 clavcli=E010318 (C)
 formato=FORMCR1    (C)
 cantida=0.4000 (N)
 nombcli=EB IMPRESORES S.A. DE C.V.                              (C)
 etapa  =F (C)
 imparti=8917.60 (N)
 consecu=E (C)
 total  =10255.24 (N)
 impuest=1337.64 (N)
 fecreal=22/08/2008 (D)
 codigop=02870 (C)
 tipofal=F          (C)
 sucursa=12 (N)
 concept=MANIOBRAS   1NINGUNO    0 (C)
 kgsfact=148.4000 (N)
 rfcclie=EIM-791004-7Y4       (C)
 tipofac=E (C)
 seriefa=E (C)
 numdoct=11218 (N)
 vto    =06/10/2008 (D)
 horafac=14:50:43 (C)
 telefon=53418358 5341-31-71//5341-2004 (C)
 delegac=AZCAPOTZALCO                                       (C)
 cobrado=4 (N)
 nompedi=GFG    (C)
 subtot =8917.60 (N)
 vendedo=28 (N)
 poriva =15.00 (N)
 porcad = 0.00000                                           (C)

	 */

}
